package com.example.study.design.proxy;

import com.example.study.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Calendar;

/**
 * cglib代理类，需要实现MethodInterceptor接口，并指定代理目标类
 *
 * @author duckquan
 */
@Component
public class UserLogProxy implements MethodInterceptor {

    @Autowired
    private UserService userService;

    /**
     * 获取用户代理类
     *
     * @return
     */
    public Object getUserLogProxy() {
        //增强器类,用来创建动态代理类
        Enhancer en = new Enhancer();
        //设置代理类的父类字节码对象
        en.setSuperclass(userService.getClass());
        //设置回调: 对于代理类上所有的方法的调用,都会调用CallBack,而Callback则需要实现intercept()方法进行拦截
        en.setCallback(this);
        //创建动态代理对象并返回
        return en.create();
    }

    /**
     *
     * @param o 代理对象
     * @param method 目标对象中的方法的Method实例
     * @param args 实际参数
     * @param methodProxy 代理对象中的方法的method实例
     * @return
     * @throws Throwable
     */
    @Override
    public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(formatter.format(calendar.getTime()) + " [" + method.getName() + "]方法被调用");
        Object result = methodProxy.invokeSuper(o, args);
        return result;
    }
}
